/**
 * 同一个事件多个监听器？模式还是一个监听函数模式？
 */
class EventEmitter {
    constructor() {
        /**
         * `用于保存时间关键字和函数`
         * @type {Map<string,Array<function>>}
         */
        this._eventMap = new Map()
    }
    /**
     * `同一事件，多个监听回调`
     * @param {string} eventName 事件名
     * @param {function} callback 事件回调
     */
    on(eventName, callback) {
        if (this._eventMap.has(eventName)) {
            this._eventMap.get(eventName).push(callback)
        } else {
            this._eventMap.set(eventName, new Array())
            this._eventMap.get(eventName).push(callback)
        }
        // this._eventTarget.addEventListener(eventName, callback)
    }
    /**
     * @param {string} eventName 事件名
     * @param {function} callback 
     */
    once(eventName, callback) {
        const handler = (...args) => {
            this.off(eventName, handler)
            callback(...args)
        }
        this.on(eventName, handler)
    }
    /**
     * @param {string} eventName 
     * @param {()=>{}} callback 
     */
    off(eventName, callback) {
        // this._eventTarget.removeEventListener(eventName, callback)
        if (this._eventMap.has(eventName)) {
            this._eventMap.get(eventName).filter(item => item != callback)
        }
    }
    /**
     * @param {string} eventName 
     * @example
     * ```js
     * new EventEmitter().emit(eventName,...params)
     * ```
     */
    emit(eventName, ...args) {
        // const event = new CustomEvent(eventName, { detail: data })
        // this._eventTarget.dispatchEvent(event)
        if (this._eventMap.has(eventName)) {
            this._eventMap.get(eventName).forEach(callback => {
                callback(...args)
            })
        }
    }
}

export default EventEmitter